[TOC]
Apa yang boleh dilakukan oleh Platform Dagangan Kuantum FMZ?
FMZ Quant Trading platform adalah komuniti kuantitatif yang paling profesional dalam bidang perdagangan kuantitatif. Di sini anda boleh belajar, menulis, berkongsi, membeli dan menjual strategi kuantitatif; anda boleh menjalankan backtesting dalam talian dan menggunakan bot simulasi untuk menjalankan perdagangan simulasi; anda juga boleh menjalankan, mempublikasikan, dan menonton perdagangan langsung. Kami menyokong hampir semua bursa mata wang digital arus perdana.
Siri Tutorial Lengkap
Tutorial Grafik:
Jika ada sebarang masalah, anda boleh menghantar soalan dan membincangkan di forum pada bila-bila masa, atau menghantar tiket, atau menghubungi pentadbir dalam kumpulan Telegram (Telegram), secara amnya, soalan ini akan dijawab dengan cepat.
Menyokong ChatGPT untuk bantuan pembangunan
Platform Perdagangan Kuantitatif FMZ telah menggunakan ChatGPT sebagai alat bantuan pembangunan yang boleh diakses dengan mengklik
Bahasa pengaturcaraan yang tersedia untuk melaksanakan strategi saya?
FMZ Quant Platform Perdagangan menyokong untuk menggunakanJavaScript
, TypeScript
, Python
, C++
, Pine
Mylanguage
danBlockly Visualization
untuk menulis dan merancang strategi.
Ia menyokongTypeScript
bahasa, masih menetapkannya kepadaJavaScript
strategi apabila kita mencipta strategi, maka kita menulis// @ts-check
pada permulaan kod strategi atau klik butangTypeScript
di sudut kanan atas kawasan penyuntingan strategi untuk beralih keTypeScript
Platform akan mengenali kod sebagaiTypeScript
secara automatik dan menyediakan anda dengan penyusunan dan sokongan pemeriksaan jenis yang sesuai untuk:
TypeScript
Fungsi pemeriksaan jenis statik boleh membantu anda mencari kesilapan yang berpotensi semasa menulis kod dan meningkatkan kualiti kod.TypeScript
Sistem jenis membuat ia lebih cepat untuk mencari sifat dan kaedah yang anda perlukan apabila menulis kod, meningkatkan kecekapan pembangunan.TypeScript
, anda boleh mengatur dan mengekalkan kod anda dengan lebih baik, menjadikannya mudah dibaca dan difahami.TypeScript
menyediakan ciri pengaturcaraan berorientasikan objek yang kuat, seperti antara muka, kelas, generik dan sebagainya, membantu anda menulis kod strategi yang lebih kukuh dan boleh digunakan semula.Anda hanya perlu menguasai salah satu bahasa ini. Selain menyokong cara merancang strategi dengan menulis kod, anda juga boleh membuat strategi menggunakan modul visual (Blockly).
Blockly
Tutorial Visualisasi:
Tetapkan
Python
penterjemah yang digunakan olehPython
program strategi
Strategi yang ditulis dalamPython
, apabila backtesting atau perdagangan langsung, jika persekitaran sistem doker mempunyai kedua-duaPython2danPython3dipasang, anda boleh menetapkanPython
versi yang akan dilancarkan pada masa berjalan pada baris pertama strategi, seperti#!python3
dan#!python2
, supaya sistem akan mencari penterjemah secara automatik. dan anda juga boleh menentukan laluan mutlak, seperti:#!/usr/bin/python3
.
Apakah Docker?
Docker boleh difahami sebagai pelaksana strategi perdagangan anda, bertanggungjawab untuk permintaan data yang kompleks, penerimaan data, pautan rangkaian, log postback dan sebagainya. Docker berjalan di pelayan anda, walaupun laman web platform Dagangan Kuantum FMZ mempunyai kegagalan rangkaian, ia tidak akan mempengaruhi operasi docker anda. Docker boleh berjalan padaLinux, Windows, Mac OS, Android, Raspberry Pi ARM Linuxdan sistem lain.Halaman Docker, Langkah pemasangan dan kemas kini Linux docker. Bot dan log yang diuruskan oleh docker disimpan dalam direktori/logs/storage
- Fail itu adalahSqlite
fail pangkalan data dengandb3
, yang boleh diedit secara langsung olehSqlite
untuk fail dengan sambungandb3
Dalam pangkalan data bot sebenar, nama fail adalah ID bot.
Protokol yang disokong
Apabila strategi dagangan dibangunkan pada platform Dagangan Kuantiti FMZ, kandungan strategi hanya dapat dilihat oleh pemegang akaun FMZ. Dan pada platform dagangan kuantitatif FMZ, anda boleh mencapai penyetempatan kod strategi yang lengkap. Sebagai contoh, logik strategi boleh dikemas dalamPython
pakej, yang dimuatkan dalam kod strategi, supaya penyetempatan kandungan strategi dapat direalisasikan.
KeselamatanPython
Kod:
KeranaPython
adalah bahasa sumber terbuka yang sangat mudah dikompilasi, jika strategi tidak untuk kegunaan peribadi tetapi untuk disewa, anda boleh menjalankan strategi pada docker yang digunakan sendiri dan menyewanya dalam bentuk sub-akaun atau pengurusan docker penuh jika anda bimbang tentang kebocoran strategi.
PenyulitanPython
Kod strategi:
Secara lalai,Python
Kod strategi tidak disulitkan apabila digunakan oleh pengarang dan disulitkan apabila disewa kepada orang lain.
Dengan mengedit kod berikut di awalPython
strategi, anda boleh menentukan sama ada untuk menyulitkan kod strategi untuk kegunaan peribadi atau sewa.Python
versi yang menyokong penyulitan kod strategi adalah seperti berikut:Python 2.7
, Python 3.5
danPython 3.6
.
#!python
sebagai versi penterjemah Python, dan kemudian menggunakan,
untuk menjaga terpisah; masukkan perintah penyulitanencrypt
Jika anda tidak menentukan versiPython
, tambah#!,encrypt
directly. #!python,encrypt
Atau
#!encrypt
#!python, not encrypted
Atau
#!not encrypted
Gunakan kodos.getenv('__FMZ_ENV__')
untuk menentukan sama ada kod penyulitan adalah sah; pengembalian rentetan"encrypt"
Ia hanya sah dalam bot sebenar, dan backtest tidak akan menyulitkanPython
Kod strategi.
#!encrypt
def main():
ret = os.getenv('__FMZ_ENV__')
# If the print variable ret is the string "encrypt" or ret == "encrypt" is true, that means the encryption is valid.
Log(ret, ret == "encrypt")
Data sensitif, seperti maklumat akaun dan rentetan disulitkan dalam parameter strategi yang dikonfigurasikan pada platform Dagangan FMZ Quant, disulitkan di penyemak imbas web. Semua maklumat yang disimpan di platform Dagangan FMZ Quant disulitkan (bukan data teks biasa), dan hanya pengguna
RSA KEY
kaedah pengesahan pertukaran sebagai contoh untuk menerangkan secara terperinci bagaimana untuk mengkonfigurasi maklumat sensitif secara tempatan pada peranti di mana program docker terletak.PKCS#8
, terdapat banyak alat yang tersedia untuk mencipta, sepertiopenssl
.RSA KEY
pada pertukaran, dan memuat naik kunci awam yang dicipta dalamLangkah 1semasa penciptaan.txt
file, atau di laluan lain dalam direktori program docker.RSA KEY
dicipta oleh pertukaran dalam kotak suntingan konfigurasiAccess Key
.txt
fail diletakkan dalam direktori peringkat yang sama dari docker diLangkah 3dalam kotak penyuntingan konfigurasiSecret Key
. Sebagai contoh, jika nama fail yang diletakkan adalah:rsaKey.txt
, dan fail dan docker diisi dalam direktori peringkat yang sama:file:///rsaKey.txt
. Jika fail berada di direktori di sebelah direktori program dockerrsa_key
, isi:file:///rsa_key//rsaKey.txt
Jika anda meletakkanrsaKey. txt
di tempat lain pada komputer atau pelayan anda mengikuti arahan ini dengan sewajarnya, perlu diperhatikan bahawa fail ini hanya boleh diletakkan sama ada pada direktori peringkat yang sama atau subdirectories berkenaan dengan docker.Ini menjadikannya lebih selamat untuk mencari dan menyimpan kunci peribadi, anda boleh merujuk kepadavideo penjelasanuntuk proses terperinci.
Apakah sistem backtest, dan untuk apa ia digunakan?
Selepas anda menyelesaikan reka bentuk strategi perdagangan kuantitatif, bagaimana anda boleh mengetahui keadaan asas strategi anda, seperti logik strategi dan arah pulangan strategi? Sudah tentu, kita tidak boleh menggunakan wang sebenar secara langsung untuk menjalankan strategi di pasaran perdagangan sebenar, tetapi kita boleh menggunakan data sejarah untuk menguji strategi anda dan mengetahui keuntungan strategi anda dalam data sejarah.
Adakah data sistem backtest tepat dan bagaimana dengan ketepatan hasil backtest?
FMZ Quant Trading platform membahagikan sistem backtest ketahap pasaran sebenardantahap simulasi. tahap pasaran sebenar adalah untuk backtest sepenuhnya mengikut data sejarah lengkap; manakala tahap simulasi backtest menghasilkantick
Kedua-duanya berdasarkan data sejarah sebenar, tetapi data peringkat pasaran sebenar lebih tepat dan hasilnya lebih dipercayai.Mekanisme FMZ BacktestWalau bagaimanapun, backtesting hanyalah prestasi strategi mengikut data sejarah. Data sejarah tidak dapat mewakili sepenuhnya pasaran masa depan. Pasaran sejarah boleh berulang, atau ia juga boleh membawa kepada Black Swan. Oleh itu, hasil backtest harus dirawat secara rasional dan objektif.
Isu-isu yang perlu diperhatikan apabila menguji semula strategi bahasa pengaturcaraan yang berbeza:
Ujian belakangJavaScriptdanC++strategi perdagangan dijalankan dalam penyemak imbas, dan bot pasaran sebenar atauWexApppasaran sebenar pertukaran (iaituWexApppertukaran FMZ Quant Trading platform) berjalan tanpa memasang sebarang perisian lain, perpustakaan atau modul. Ujian belakangPythondilakukan pada docker; ia boleh dilakukan pada pelayan awam yang ditambahkan oleh platform FMZ Quant Trading, dan ia juga boleh dilakukan pada docker pengguna sendiri.PythonJika beberapa perpustakaan diperlukan, mereka perlu dipasang secara manual (hanya perpustakaan biasa disokong pada pelayan awam).
Data Backtest dalam Sistem
Terdapat dua jenis backtest platform FMZ Quant Trading: backtest tahap simulasi dan backtest tahap pasaran sebenar.tick
Setiap tempoh K-line akan menjana 12 titik masa backtesting; Walau bagaimanapun, tahap pasaran sebenar mengumpulticks
sebenarnya, yang akan berlaku kira-kira sekali setiap beberapa saat, mengakibatkan sejumlah besar data dan kelajuan backtest yang lebih perlahan; jadi ia tidak boleh backtest untuk jangka masa yang sangat lama. mekanisme backtest FMZ membolehkan strategi perdagangan untuk berdagang beberapa kali pada satu K-line, mengelakkan keadaan di mana perdagangan hanya boleh dilaksanakan pada harga dekat. Ia lebih tepat sambil mengambil kira kelajuan backtest.Hubungan.
Kaedah DEBUG Strategi dalam sistem backtesting
JavaScript strategi backtesting debugging dalam Chrome DevTools
Mata Wang Dienkripsi (mata wang kripto)
Nama | Jenis | Petua |
---|---|---|
Bitfinex | objek pertukaran spot | menyokong pasangan dagangan terhad, seperti:BTC_USD , ETH_USD danLTC_USD , dll (perhatikan mata wang sebut harga pasangan dagangan adalahUSD dolar) |
Binance | objek pertukaran spot | menyokong pasangan dagangan terhad, seperti:BTC_USDT , ETH_USDT , ETH_BTC danLTC_BTC , dan lain-lain |
OKX | objek pertukaran spot | menyokong pasangan dagangan terhad, seperti:BTC_USDT , ETH_USDT , ETH_BTC danLTC_BTC , dan lain-lain |
Huobi | objek pertukaran spot | menyokong pasangan dagangan terhad, seperti:BTC_USDT , ETH_USDT , ETH_BTC danLTC_BTC , dan lain-lain |
OKX Futures | Objek pertukaran niaga hadapan | menyokong pasangan dagangan terhad, seperti:BTC_USD danETH_USD , dan lain-lain; mata wang sebut harga pasangan dagangan adalahUSD ; selepas menetapkan kod kontrak khusus (sila rujuk fungsiexchange.SetContractType ), kontrak adalah kontrak crypto-margined; kod kontrak yang disokong termasuk:this_week , next_week , quarter danswap |
HuobiDM | Objek pertukaran niaga hadapan | HuobiDM adalah Huobi Futures (Huobi Contract), yang menyokong pasangan dagangan terhad, seperti:BTC_USD danETH_USD , dan lain-lain; mata wang sebut harga pasangan dagangan adalahUSD ; selepas menetapkan kod kontrak khusus (sila rujuk fungsiexchange.SetContractType ), kontrak adalah kontrak crypto-margined; kod kontrak yang disokong termasuk:this_week , next_week , quarter danswap . |
BitMEX | Objek pertukaran niaga hadapan | pasangan dagangan adalahXBT_USD ; selepas menetapkan kod kontrak khusus (sila rujuk fungsiexchange.SetContractType ), kontrak adalah kontrak dengan margin kripto; kod kontrak yang disokong ialah:XBTUSD |
Binance Futures | Objek pertukaran niaga hadapan | menyokong pasangan dagangan terhad, seperti:BTC_USDT danETH_USDT , dan lain-lain; mata wang sebut harga pasangan dagangan adalahUSD ; selepas menetapkan kod kontrak khusus (sila rujuk fungsiexchange.SetContractType ), kontrak itu adalahUSDT - kontrak margin; kod kontrak yang disokong adalahswap |
Pilihan Derbit | Objek pertukaran niaga hadapan | Pasangan dagangan adalah:BTC_USD danETH_USD ; selepas menetapkan kod kontrak khusus (sila rujuk fungsiexchange.SetContractType ), kontrak adalah kontrak dengan margin kripto; kod kontrak opsyen khusus perlu ditetapkan |
Untuk objek pertukaran niaga hadapan dalam sistem backtest, menukar pasangan dagangan tidak disokong sementara dalam kod strategi.
Ujian belakang tahap simulasi adalah berdasarkan data K-line asas sistem backtest, mensimulasikan data tik dalam rangka harga tertinggi, harga terendah, harga pembukaan, dan nilai harga penutupan Bar K-line asas tertentu mengikut algoritma tertentu.tick
data apabila antara muka diminta. Untuk butiran, sila rujuk:FMZ Quant Simulation Level Backtest Mechanism Penerangan.
Ujian belakang tahap pasaran sebenar adalahtick
Data tahap dalam siri masa Bar.tick
data tahap, menggunakan tahap pasaran sebenar untuk backtest adalah lebih dekat kepada realiti.tick
data adalah data yang direkodkan sebenar, bukan yang disimulasikan. Ia menyokong data kedalaman, main semula data rekod perdagangan pasaran, kedalaman tersuai dan setiap data perdagangan individu. Saiz maksimum backtest data peringkat pasaran sebenar adalah maksimum 50MB, tanpa had pada julat masa backtest dalam had atas set data. Jika anda perlu memperbesar julat masa backtest sebanyak mungkin, anda boleh mengurangkan nilai peralatan tetapan kedalaman Panggilan dan tidak menggunakan setiap data perdagangan individu untuk meningkatkan julat masa backtest.GetDepth
,GetTrades
Pada masa data pasaran pada garis masa, memanggilGetTicker
,GetTrades
, GetDepth
danGetRecords
tidak akan mendorong masa beberapa kali apabila masa bergerak pada garis masa backtest (yang tidak akan mencetuskan lompatan ke masa data pasaran seterusnya). Panggilan berulang ke salah satu fungsi di atas akan mendorong masa backtest untuk bergerak pada garis masa backtest (lompat ke masa data pasaran seterusnya). Apabila tahap pasaran sebenar digunakan untuk backtest, masa yang lebih awal tidak disyorkan untuk memilih. Mungkin tidak ada data tahap pasaran sebenar dalam tempoh masa yang lebih awal.
Ujian belakang tahap pasaran sebenar kini menyokong:
Fungsi pengoptimuman parameter sistem backtest platform FMZ Quant Trading adalah untuk menetapkan pengoptimuman mengikut setiap pilihan pengoptimuman parameter semasa backtest, dan pilihan ditunjukkan seperti berikut:
Menghasilkan kombinasi parameter, dan melintasi semua kombinasi itu untuk backtest (iaitu backtesting setiap kombinasi parameter sekali).nomborjenis boleh dioptimumkan dalam sistem backtesting.
Sebagai contoh, menetapkan pilihan pengoptimuman parameter pada halaman backtest:
Ujian belakang mod pengoptimuman parameter:
Dalam halaman penyuntingan strategi, dalam paginasi
AmbilJavaScript
strategi sebagai contoh, dan klik
Terdapat sedikit perbezaan pada JavaScript
, Python
, cpp
danMylanguage
:
/*backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
platforms: [{"eid":"Binance","currency":"BTC_USDT"}]
*/
'''backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
platforms: [{"eid":"Binance","currency":"BTC_USDT"}]
'''
/*backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
platforms: [{"eid":"Binance","currency":"BTC_USDT"}]
*/
Mylanguage:
(*backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
platforms: [{"eid":"Futures_OKCoin","currency":"BTC_USD"}]
*)
Sistem ini menggunakanGET
kaedah untuk meminta URL tersuai (URL yang boleh diakses awam) untuk mendapatkan sumber data luaran untuk backtest. Parameter permintaan tambahan adalah seperti berikut:
Parameter | Makna | Penjelasan |
---|---|---|
Simbol | Nama Simbol | seperti BTC_USD_OKCoin_EN |
Idul Fitri | Pertukaran | seperti OKCoin_EN |
Bulat | Keakuratan Harga | seperti 3, harga dalam data yang dikembalikan mesti didarabkan dengan 1000 dan dibulatkan |
Di sekeliling | Ketepatan kuantiti | seperti 2, jumlah dalam data yang dikembalikan mesti didarabkan dengan 100 dan dibulatkan |
Tempoh | Tempoh bar (milisaat) | seperti 60,000 menunjukkan bar meminta satu minit |
Kedalaman | Tahap Kedalaman | 1-20 |
Perdagangan | Sama ada perlu untuk membahagikan data | benar/salah |
Dari | Masa Mula | cap masa unix |
Untuk | Masa Akhir | cap masa unix |
Nota:
Round and V-Round are two parameters designed to avoid losing the precision of floating-point numbers during network transmission. The price data, trading volume and order amount, are all transmitted using integers.
Contoh data yang dijahit:
http://customserver:80/data?symbol=BTC_USD_OKCoin_EN&eid=OKCoin_EN&round=3&vround=3&period=900000&from=1564315200&to=1567267200
Format yang dikembalikan mestilah salah satu daripada dua format berikut (yang akan dikenali oleh sistem secara automatik):
Ujian belakang peringkat bar biasa
{
"schema":["time","open","high","low","close","vol"],
"data":[[1564315200000,9531300,9531300,9497060,9497060,787],[1564316100000,9495160,9495160,9474260,9489460,338]]
}
Data backtest tahap Tick (termasuk maklumat kedalaman pasaran, array dengan format kedalaman [harga, jumlah]; boleh ada pelbagai tahap kedalaman;
meminta merujuk kepada pesanan harga yang meningkat, dan tawaran merujuk kepada pesanan harga yang terbalik.)
{
"schema":["time","asks", "bids","trades","close","vol"],
"data":[[1564315200000,[[9531300,10]], [[9531300,10]],[[1564315200000,0,9531300,10]],9497060,787]]
}
Penerangan
Lapangan | Penerangan |
---|---|
Skema | Ia menentukan atribut lajur dalam array data, yang sensitif huruf besar dan hanya terhad kepada |
Data | Array yang menyimpan data mengikut skema |
Format Data
Lapangan | Penerangan |
---|---|
Permintaan/Tawaran | [harga, jumlah],...] |
perdagangan | [waktu,arah] [0:beli,1:jual],harga,volume],...] |
Menyediakan data kadar pembiayaan:
Sebagai contoh, ketika melakukan backtesting Binance Futures, adalah perlu untuk mempunyai data tambahan kadar pembiayaan, yang perlu disediakan oleh sumber data tersuai.
{
"detail": {},
"symbol": "futures_binance.eth_usdt.funding",
"schema": ["time", "open", "high", "low", "close", "vol"],
"data": [
[1582876800000, 25289, 25289, 25289, 25289, 0],
[1582905600000, 30522, 30522, 30522, 30522, 0],
[1582934400000, 40998, 40998, 40998, 40998, 0],
...
[1626652800000, 198, 198, 198, 198, 0],
[1626681600000, 691, 691, 691, 691, 0], // The adjacent periodic interval is 8 hours
[1626710400000, 310, 310, 310, 310, 0], // The funding rate of Binance updates every 8 hours, and why the data of the funding rate turns out to be 310?
[1626739200000, 310, 310, 310, 310, 0], // Like the bars data, to avoid losing the precision of floating-point numbers during network transmission, the data uses integer, so the data needs to be processed according to round parameter; the data, returned to the backtest system after processing, is 310
[1626768000000, -41610, -41610, -41610, -41610, 0], // The funding rate might be a negative value
[1626796800000, -5125, -5125, -5125, -5125, 0],
...
[1627977600000, 10000, 10000, 10000, 10000, 0]
]
}
Contoh permintaan data dari sistem backtest:
http://customserver:80/data?symbol=futures_binance.eth_usdt.funding&eid=Futures_Binance&round=8&vround=5&depth=20&trades=1&custom=0&period=3600000&from=1360771200&to=1628006400
Contoh untuk sumber data tersuai:
Tentukan sumber data, URL:http://xxx.xx.x.xx:9090/data
Sesuaikan pelayan data, ditulis dalam golang:
package main
import (
"fmt"
"net/http"
"encoding/json"
)
func Handle (w http.ResponseWriter, r *http.Request) {
// e.g. set on backtest DataSourse: http://xxx.xx.x.xx:9090/data
// r.URL: /data?depth=20&detail=true&eid=Binance&from=1566820800&period=900000&round=3&symbol=BTC_USDT_Binance&to=1569686400&trades=1&vround=5
// response
defer func() {
// response data
/* e.g. data
{
"schema":["time","open","high","low","close","vol"],
"data":[
[1564315200000,9531300,9531300,9497060,9497060,787],
[1564316100000,9495160,9495160,9474260,9489460,338]
]
}
*/
ret := map[string]interface{}{
"schema" : []string{"time","open","high","low","close","vol"},
"data" : []interface{}{
[]int64{1564315200000,9531300,9531300,9497060,9497060,787},
[]int64{1564316100000,9495160,9495160,9474260,9489460,338},
},
}
b, _ := json.Marshal(ret)
w.Write(b)
}()
}
func main () {
fmt.Println("listen http://localhost:9090")
http.HandleFunc("/data", Handle)
http.ListenAndServe(":9090", nil)
}
Strategi ujian,JavaScript
contoh:
/*backtest
start: 2019-07-28 00:00:00
end: 2019-07-29 00:00:00
period: 1m
platforms: [{"eid":"OKX","currency":"BTC_USDT","feeder":"http://120.24.2.20:9090/data"}]
*/
function main() {
var ticker = exchange.GetTicker()
var records = exchange.GetRecords()
Log(ticker)
Log(records)
}
Carta yang digambar oleh data tersuai dalam sistem backtest:
Maklumat cetak strategi:
Platform FMZ Quant Trading telah membuka sumber untukJavaScript
versi danPython
versi enjin backtest tempatan, sokongan tetapanTempoh Garis K Asassemasa backtesting.
Tombol pintasan untuk beralih antara halaman
Gunakan kunci.Ctrl +,
untuk beralih semula ke halaman Ctrl
Tekan kekunci.,
.
Kunci pintasan untuk strategi penjimatan
Gunakan kunci.Ctrl + s
untuk menyelamatkan strategi.
Pintasan untuk memulakan strategi backtest
Gunakan kunci.Ctrl + b
untuk membolehkan
Nama Fungsi | Penerangan |
---|---|
main() |
Ia adalah fungsi kemasukan. |
onexit() |
Ia adalah fungsi pembersihan apabila keluar secara normal, masa pelaksanaannya maksimum adalah 5 minit, yang boleh dibiarkan tidak dideklarasikan;menggangguKesilapan akan dilaporkan. |
onerror() |
ia adalah fungsi keluar yang tidak normal, masa pelaksanaannya maksimum adalah 5 minit, yang boleh dibiarkan tidak dideklarasikan.Python dancpp tidak menyokong fungsi ini. |
init() |
ia adalah fungsi inisialisasi, program strategi akan dipanggil secara automatik apabila ia mula berjalan, yang boleh dibiarkan tidak dinyatakan. |
onerror()
.onerror()
adalah dicetuskan dalam bot, fungsionexit()
tidak akan dicetuskan.onexit()
, memproses kerja pembersihan, dengan masa pelaksanaan maksimum 5 minit, yang diwujudkan oleh pengguna.
function main(){
Log("Start running, stop after 5 seconds, and execute onexit function!")
Sleep(1000 * 5)
}
// onexit function implementation
function onexit(){
var beginTime = new Date().getTime()
while(true){
var nowTime = new Date().getTime()
Log("The program stops counting down..The cleaning starts and has passed:", (nowTime - beginTime) / 1000, "Seconds!")
Sleep(1000)
}
}
import time
def main():
Log("Start running, stop after 5 seconds, and execute onexit function!")
Sleep(1000 * 5)
def onexit():
beginTime = time.time() * 1000
while True:
ts = time.time() * 1000
Log("The program stops counting down..The cleaning starts and has passed:", (ts - beginTime) / 1000, "Seconds!")
Sleep(1000)
void main() {
Log("Start running, stop after 5 seconds, and execute onexit function!");
Sleep(1000 * 5);
}
void onexit() {
auto beginTime = Unix() * 1000;
while(true) {
auto ts = Unix() * 1000;
Log("The program stops counting down..The cleaning starts and has passed:", (ts - beginTime) / 1000, "Seconds!");
Sleep(1000);
}
}
Pengguna melaksanakan fungsi inisialisasiinit()
, yang akan secara automatik melaksanakan fungsiinit()
pada permulaan strategi untuk menyelesaikan tugas inisialisasi.
function main(){
Log("The first line of the code executed in the program!", "#FF0000")
Log("Exit!")
}
// Initialization Function
function init(){
Log("Initialization!")
}
def main():
Log("The first line of the code is executed!", "#FF0000")
Log("Exit!")
def init():
Log("Initialization!")
void main() {
Log("The first line of the code is executed!", "#FF0000");
Log("Exit!");
}
void init() {
Log("Initialization!");
}
Pelaksanaan fungsionerror()
fungsi ini tidak menyokong strategi yang ditulis dalamPython
dancpp
.
function main() {
var arr = []
Log(arr[6].Close)
}
function onerror() {
Log("error")
}
# not supported by python
// not supported by C++
Dalam strategi yang ditulis dalamJavaScript
, Python
dancpp
, yangSleep()
fungsi perlu dipanggil dalam gelung utama strategi tersebut. Ia akan digunakan untuk mengawal kelajuan mundur. Dalam bot, ia digunakan untuk mengawal selang pilihan raya strategi, dan juga mengawal kekerapan permintaan mengakses antara muka API pertukaran.
Contoh kerangka asas strategi mata wang kripto:
function onTick(){
//Write strategy logic here, and it will be called constantly, such as printing market information
Log(exchange.GetTicker())
}
function main(){
while(true){
onTick()
//The function "Sleep" is mainly used to control the polling frequency of cryptocurrency strategies to prevent accessing the exchange API interafce too frequently
Sleep(60000)
}
}
def onTick():
Log(exchange.GetTicker())
def main():
while True:
onTick()
Sleep(60000)
void onTick() {
Log(exchange.GetTicker());
}
void main() {
while(true) {
onTick();
Sleep(60000);
}
}
Ambil contoh yang paling mudah, jika saya mahu meletakkan pesanan beli dengan harga 100 dan kuantiti 1 di bursa setiap saat, saya boleh menulisnya seperti ini:
function onTick(){
// It is just an example; for all the assets will be used to place orders fast during backtest or in the bot, do not implement the example in the bot
exchange. Buy(100, 1)
}
function main(){
while(true){
onTick()
// The pause period can be customized in millisecond (1 second = 1000 milliseconds)
Sleep(1000)
}
}
def onTick():
exchange.Buy(100, 1)
def main():
while True:
onTick()
Sleep(1000)
void onTick() {
exchange.Buy(100, 1);
}
void main() {
while(true) {
onTick();
Sleep(1000);
}
}
PeraturanPerpustakaan templatadalah modul kod yang boleh digunakan semula dalam platform FMZ Quant Trading, berfungsi sebagai kod kategori strategi dagangan.Perpustakaan Templat, templat ditambahkan di halaman
JavaScript
:
Python
:
cpp
:
Fungsi Pengeksport Perpustakaan Templat Fungsi eksport adalah fungsi antara muka perpustakaan Template, dan ia boleh dipanggil dengan strategi yang merujuk kepada perpustakaan Template.
/*
-- This method is called directly with $.Test() after the strategy refers to the template
-- The "main" function will not be triggered in the strategy, and it is only used as the entry point for template debugging
*/
$.Test = function() {
Log('Test')
}
function main() {
$.Test()
}
def Test():
Log("template call")
# Export "Test" function; the main strategy can be called by ext.Test()
ext.Test = Test
// The strategy refers to the template and calls this method directly with ext::Test()
void Test() {
Log("template call");
}
Kod perpustakaan templat:
$.SetParam1 = function(p1) {
param1 = p1
}
$.GetParam1 = function() {
Log("param1:", param1)
return param1
}
def SetParam1(p1):
global param1
param1 = p1
def GetParam1():
Log("param1:", param1)
return param1
ext.SetParam1 = SetParam1
ext.GetParam1 = GetParam1
void SetParam1(float p1) {
param1 = p1;
}
float GetParam1() {
Log("param1:", param1);
return param1;
}
Rujuk kod strategi dalamPerpustakaan Templatcontoh yang disebutkan di atas:
function main () {
Log("call $.GetParam1:", $.GetParam1())
Log("call $.SetParam1:", "#FF0000")
$.SetParam1(20)
Log("call $.GetParam1:", $.GetParam1())
}
def main():
Log("call ext.GetParam1:", ext.GetParam1())
Log("call ext.SetParam1:", "#FF0000")
ext.SetParam1(20)
Log("call ext.GetParam1:", ext.GetParam1())
void main() {
Log("call ext::GetParam1:", ext::GetParam1());
Log("call ext::SetParam1:", "#FF0000");
ext::SetParam1(20);
Log("call ext::GetParam1:", ext::GetParam1());
}
Kutipan
Selepas memeriksa rujukan dalam lajur templat halaman penyuntingan strategi, simpan strategi.
Exchange
Semua interaksi data dengan pertukaran direalisasikan melalui fungsi dalam objek ini.
Menambah objek pertukaran dalam
Menambah objek pertukaran pada halaman
Objek pertukaran yang ditambahkanexchange
objek dalam kod:
function main() {
Log("The name of the first exchange object added on the bot page or backtest page:", exchange.GetName(), ", Label:", exchange.GetLabel())
}
def main():
Log("The name of the first exchange object added on the bot page or backtest page:", exchange.GetName(), ", Label:", exchange.GetLabel())
void main() {
Log("The name of the first exchange object added on the bot page or backtest page:", exchange.GetName(), ", Label:", exchange.GetLabel());
}
Ia boleh difahami sebagai array yang menyimpan semua objek pertukaran sepertiexchange
objek pertukaran, yang boleh mengandungi beberapa objek pertukaran;exchanges[0]
adalahexchange
.
Objek pertukaran yang ditambahkan adalahexchanges[0]
, exchanges[1]
, exchanges[2]
...dan seterusnya dalam kod strategi.
function main() {
for(var i = 0; i < exchanges.length; i++) {
Log("Index of the exchange object added (the first one is 0 and so on):", i, "Name:", exchanges[i].GetName(), "Label:", exchanges[i].GetLabel())
}
}
def main():
for i in range(len(exchanges)):
Log("Index of the exchange object added (the first one is 0 and so on):", i, "Name:", exchanges[i].GetName(), "Label:", exchanges[i].GetLabel())
void main() {
for(int i = 0; i < exchanges.size(); i++) {
Log("Index of the exchange object added (the first one is 0 and so on):", i, "Name:", exchanges[i].GetName(), "Label:", exchanges[i].GetLabel());
}
}
AtributStatus
dalamOrder
structure.
Nama Tetap | Definisi | Nilai |
---|---|---|
ORDER_STATE_PENDING | tidak selesai | 0 |
ORDER_STATE_CLOSED | Selesai | 1 |
ORDER_STATE_CANCELED | dibatalkan | 2 |
ORDER_STATE_UNKNOWN | keadaan tidak diketahui (negara lain) | 3 |
ORDER_STATE_UNKNOWNstatus boleh memanggilexchange.GetRawJSON()
untuk mendapatkan maklumat status pesanan asal, query fail pertukaran, dan melihat penerangan khusus.
Nama-nama yang berterusan dalam borang boleh digunakan secara langsung dalam kod strategi untuk membandingkan dengan sifatStatus
dalamOrder
Mencetak nama-nama yang berterusan akan menunjukkan status pesanan dengan menilai sama ada mereka sama.nama-nama berterusandan yang sepadannilai, dan nama-nama pelarut lain di bawah berfungsi dengan cara yang sama, jadi tidak akan ada penerangan yang lebih terperinci mengenai mereka.
AtributType
dalamOrder
structure.
Nama Tetap | Definisi | Nilai |
---|---|---|
ORDER_TYPE_BUY | Membeli Perintah | 0 |
ORDER_TYPE_SELL | Perintah Jual | 1 |
AtributType
dalamPosition
structure.
Nama Tetap | Definisi | Penerangan | Berlaku | Nilai |
---|---|---|---|---|
PD_LONG | Posisi Panjang | Penggunaan niaga hadapan cryptocurrencyexchange.SetDirection("closebuy") untuk menetapkan arah kedudukan dekat, dan menutup jenis kedudukan ini |
Masa hadapan mata wang kripto | 0 |
PD_SHORT | Posisi Pendek | Penggunaan niaga hadapan cryptocurrencyexchange.SetDirection("closesell") untuk menetapkan arah kedudukan dekat, dan menutup jenis kedudukan ini |
Masa hadapan mata wang kripto | 1 |
AtributOffset
dalamOrder
structure.
Nama Tetap | Definisi | Nilai |
---|---|---|
ORDER_OFFSET_OPEN | Perintah Posisi Terbuka | 0 |
ORDER_OFFSET_CLOSE | Perintah Posisi Tutup | 1 |
Dalam kod strategi dagangan, parameter strategi yang ditetapkan pada antara muka strategi tercermin dalam bentuk pembolehubah global.JavaScript
bahasa boleh terus mengakses nilai parameter yang ditetapkan atau diubah suai pada antara muka strategi; sementara dalam fungsiPython
strategi, kata kunciglobal
diperlukan untuk mengubah suai pembolehubah global dalam strategi.
Jenis parameter:
Variabel | Penerangan | Catatan | Jenis | Nilai lalai | Penerangan |
---|---|---|---|---|---|
Nombor | Jenis nombor | Catatan | Nombor | 1 | Strategi C ++ adalah jenis koma terapung |
String | senar | Catatan | String (string) | Halo FMZ | Nilai lalai tidak perlu dipetik. input dianggap sebagai rentetan |
Kotak | ComboBox | Catatan | ComboBox (dipilih) | 1|2|3 | Variabel combox itu sendiri adalah nilai berangka, yang mewakili indeks lajur yang dipilih oleh kawalan Combobox. Nilai ComboBox pertama adalah 1, dan yang lain adalah 0, dan sebagainya |
Bool | Pilihan semak | Catatan | Boolean (benar/salah) | betul | Jika diperiksa, pembolehubah bool adalah benar; jika tidak diperiksa, pembolehubah bool adalah salah |
RahsiaString | Senar yang disulitkan | Catatan | String yang disulitkan (string) | Kata laluan | Dengan penggunaan yang sama seperti rentetan, rentetan yang disulitkan akan dihantar dengan penyulitan dan tidak akan dihantar dalam teks biasa |
number
, string
, combox
, bool
, secretString
.Tetapan Kebergantungan Parameter:
Satu parameter boleh ditetapkan untuk membenarkan parameter lain untuk dipaparkan dan tersembunyi berdasarkan pilihan parameter.numberA
, yang merupakan jenis nombor.numberA
akan dipaparkan atau disembunyikan berdasarkan sama ada parameterisShowA
Kita perlu menetapkan pembolehubahnumberA
pada parameter antara muka sebagai:numberA@isShowA
.
Dengan cara ini, jika parameterisShowA
tidak diperiksa, parameternumberA
Bagi parameter jenis kawalan ComboBox, bahagian bergantung parameter adalah untuk menilai sama ada nilai parameter sama dengannilai indeksdengan cara yang sama, mengambil parameterisShowA
Apabila menetapkan pembolehubah dalam parameter, tulis:numberA@combox==2
. ParameternumberA
akan memaparkan atau menyembunyikan, berdasarkan sama ada parametercombox
akan diperiksa sebagai pilihan ketiga (di mana indeks 0 sepadan dengan pilihan pertama, indeks 1 sepadan dengan pilihan kedua, dan indeks 2 sepadan dengan pilihan ketiga.)
Parameter antara muka strategi, kawalan interaktif, dan fungsi pengelompokan parameter pada (?First group)
pada permulaan penerangan parameter yang memulakan pengelompokan, seperti yang ditunjukkan dalam gambar berikut:
Apabila anda menggunakan strategi, parameter dipaparkan dalam kumpulan:
Simpan parameter nilai lalai:
Parameter strategi ditunjukkan dalam gambar. Semasa backtest, jika anda ingin menyimpan nilai lalai parameter strategi, anda boleh klikSave settings
butang selepas mengubah suai parameter strategi.
Anda boleh menyimpan tetapan parameter strategi dalam bentuk kod:
/*backtest
start: 2020-02-29 00:00:00
end: 2020-03-29 00:00:00
period: 1d
args: [["number",2],["string","Hello FMZ.COM"],["combox",2],["bool",false],["numberA@isShowA",666],["isShowA",true]]
*/
'''backtest
start: 2020-02-29 00:00:00
end: 2020-03-29 00:00:00
period: 1d
args: [["number",2],["string","Hello FMZ.COM"],["combox",2],["bool",false],["numberA@isShowA",666],["isShowA",true]]
'''
/*backtest
start: 2020-02-29 00:00:00
end: 2020-03-29 00:00:00
period: 1d
args: [["number",2],["string","Hello FMZ.COM"],["combox",2],["bool",false],["numberA@isShowA",666],["isShowA",true]]
*/
Beberapa fungsi akan disertakan dengan asalJSON
data yang diminta semasa panggilan.JSON
data disimpan dalam atributInfo
Oleh kerana backtest tidak untuk mengakses antara muka platform, data yang dikembalikan semasa backtest tidak mempunyai sifatInfo
Berikut adalah penerangan ciri utama setiap struktur data.
Dapatkan semua sejarah dagangan (bukan sendiri), dikembalikan oleh fungsiexchange.GetTrades()
.
{
Id : 9585306, // Trading record ID; if the exchange interface does not provide order ID, use the timestamp to fill in
Time : 1567736576000, // Time (Unix timestamp milliseconds)
Price : 1000, // Price
Amount : 1, // Volume
Type : 0 // Order Type; refer to the order type in the constants; 0 is ORDER_TYPE_BUY, meaning the value of ORDER_TYPE_BUY is 0
}
Nilai pasaran dikembalikan oleh fungsiexchange.GetTicker()
.
{
Info : {...}, // After requesting the platform interface, this attribute is not available in the raw data that the exchange interface responds to, during the backtest
High : 1000, // Highest price; if the platform interface does not provide the 24-hour highest price, use sell price 1 to fill in
Low : 500, // Lowest price; if the platform interface does not provide the 24-hour lowest price, use buy price 1 to fill in
Sell : 900, // Sell price 1
Buy : 899, // Buy price 1
Last : 900, // Last executed price
Volume : 10000000, // Recent trading volume; in principle, the unit of spot trading volume is base currency, and the unit of futures trading volume is contract quantity. If the platform interface does not provide this kind of data, use the existing data of the platform interface to fill in; for instance, it might be a trading volume in the unit of quote currency
Time : 1567736576000 // Millisecond-level timestamp
}
StandardOHLC
struktur digunakan untuk melukis K-garis dan proses pengiraan penunjuk dan analisis.exchange.GetRecords()
mengembalikan array struktur. SetiapRecord
struktur mewakili bar k-garis, iaitu satu k-garisBAR
.Time
dalamRecord
adalah masa permulaan tempoh bar K-line.
{
Time : 1567736576000, // A timestamp, accurate to millisecond, in the same format as the result obtained by Javascript's newDate().GetTime()
Open : 1000, // Open price
High : 1500, // Highest price
Low : 900, // Lowest price
Close : 1200, // Close price
Volume : 1000000 // Trading volume; in principle, the unit of spot trading volume is base currency, and the unit of futures trading volume is contract quantity. If the platform interface does not provide this kind of data, use the existing data of the platform interface to fill in; for instance, it might be a trading volume in the unit of quote currency
}
Struktur pesanan boleh dikembalikan oleh fungsi, termasukexchange.GetOrder()
danexchange.GetOrders()
. Fungsiexchange.GetOrders()
mengembalikan susunan atau susunan kosong struktur (jika tidak adaPerintah yang belum selesai, kembali[]
, iaitu, array kosong).
{
Info : {...}, // After requesting the platform interface, this attribute is not available in the raw data that the exchange interface responds to, during the backtest
Id : 123456, // Unique ide